<?php
/**
 * winbinder 패키지 
 * 
 * 
 * @package php.ui.winbinder
 */


import("modules.winbinder.winbinder");

/**
 * Application 클래스 
 *
 * @package php.ui.winbinder
 */
class WBApplication { 

	/**
	 * 아이디 기본 수 
	 *
	 */
	public static $_idCount = 10000;

	/**
	 * 아이디별 Control 리스트 
	 *
	 */
	public static $_idList = array();

	/**
	 * 이름별 id 리스트 
	 *
	 */
	public static $_nameList = array();

	/**
	 * instance별 window 리스트 
	 *
	 */
	public static $_windowList = array();

	/**
	 * 이벤트 상수 문자열 리스트 
	 *
	 */
	public static $_eventList = array(
		WBC_DBLCLICK	=> 'dblclick',
		WBC_MOUSEMOVE	=> 'mousemove',
		WBC_MOUSEDOWN	=> 'mousedown',
		WBC_MOUSEUP		=> 'mouseup',
		WBC_KEYDOWN		=> 'keydown',
		WBC_KEYUP		=> 'keyup',
		WBC_GETFOCUS	=> 'focus',
		WBC_REDRAW		=> 'redraw',
		WBC_RESIZE		=> 'resize',
	);

	/**
	 * 클래스 문자열 
	 *
	 */
	public static $_classList = array(
		AppWindow		=> 'AppWindow',
		ModalDialog		=> 'ModalDialog',
		ModelessDialog	=> 'ModelessDialog',
		NakedWindow		=> 'NakedWindow',
		PopupWindow		=> 'PopupWindow',
		ResizableWindow	=> 'ResizableWindow',
		ToolDialog		=> 'ToolDialog',

		Accel			=> 'Accel',
		Calendar		=> 'Calendar',
		CheckBox		=> 'CheckBox ',
		ComboBox		=> 'ComboBox',
		EditBox			=> 'EditBox',
		Frame			=> 'Frame',
		Gauge			=> 'Gauge',
		HTMLControl		=> 'HTMLControl',
		HyperLink		=> 'HyperLink',
		ImageButton		=> 'ImageButton',
		InvisibleArea	=> 'InvisibleArea',
		Label			=> 'Label',
		ListBox			=> 'ListBox',
		ListView		=> 'ListView',
		Menu			=> 'Menu',
		PushButton		=> 'PushButton',
		RadioButton		=> 'RadioButton',
		RTFEditBox		=> 'RTFEditBox',
		ScrollBar		=> 'ScrollBar',
		Slider			=> 'Slider',
		Spinner			=> 'Spinner',
		StatusBar		=> 'StatusBar',
		TabControl		=> 'TabControl',
		ToolBar			=> 'ToolBar',
		TreeView		=> 'TreeView',
	);
	
	public static $_layoutList = array(
		'full',
		'spring',
		'table',
		'null',
		'grid',
		'vbox',
		'hbox',
		'button',
		'fit'
	);

	/**
	 * 이벤트 대기 시작 
	 *
	 *
	 */
	public static function start() { 
		wb_main_loop();
	}

	/**
	 * id 또는 name 기반 Control 객체 얻어오기 
     * 
	 * @param int|string $id Control의 아이디 
	 * @return WBComponent 
	 */
	public static function getObject($id) { 
		if (is_string($id)) { 
			$id = self::$_nameList[$id];
		}

		return self::$_idList[$id];
	}

	/**
	 * id별 객체 설정 
	 *
	 * @param int $id 컴포넌트 아이디 
	 * @param WBComponent $obj 컴포넌트 객체 
	 */
	public static function setObject($id, $obj) { 
		if(isset(self::$_idList[$id])) { 
			return false;
		} else { 
			self::$_idList[$id] = $obj;
			return true;
		}
	}
	
	/**
	 * WinBinder 지정된 상수 얻어오기  
	 * 
	 * @param string|int $constant
	 * @param string $prefix default value : wbc 
	 * @return int
	 */
	public static function getConstant($constant, $prefix = 'WBC') {
		
		if (is_string($constant)) {
			$list = explode(" ", $constant);
			foreach ($list as $i => $value) { 
				$list[$i] = strtoupper("${prefix}_${value}");
			}

			$temp = 0;
			
			foreach ($list as $value) { 
				if (defined($value)) { 
					$temp |= constant($value);
				}					
			}
			
			return $temp;
		}

		if (defined($constant)) { 
			return constant($constant);
		}		
		
		return $constant;
	}
	
	/**
	 * name별 id 설정 
	 *
	 * @param string $name 컴포넌트 객체 이름 
	 * @param int $id 컴포넌트 아이디 
	 */
	public static function setName($name, $id) { 
		if(isset(self::$_nameList[$name])) { 
			return false;
		} else { 
			self::$_nameList[$name] = $id;
			return true;
		}
	}

	/**
	 * instance에 맞는 window 객체 얻어오기 
	 *
	 * @param int $instance window객체 instance 
	 * @return WBWindow 
	 */
	public static function getWindow($instance) { 
		return self::$_windowList[$instance];
	}

	/**
	 * instance 별 window 객체 설정 
	 * 
	 * @param int $instance 
	 * @param WBWindow $obj 
	 */
	public static function setWindow($instance, $obj) { 
		if(isset(self::$_windowList[$instance])) { 
			return false;
		} else { 
			self::$_windowList[$instance] = $obj;
			return true;
		}
	}

	/**
	 * 객체의 최상위 윈도우 객체 얻기 
	 *
	 * @param WBComponent $obj 상위 윈도우 객체를 얻을 component
	 * @return mixed WBWindow, WBTabControl, null 리턴 
	 */
	public static function getParent($obj) { 
		if ($obj instanceof WBWindow) return $obj;
		if ($obj instanceof WBTabControl) return $obj;
		if ($obj instanceof WBComponent) return WBApplication::getParent($obj->getOption('parent'));
		
		return null;		
	}

	/**
	 * unique id 생성 
	 *
	 * @return int 
	 */
	public static function getIdCount() { 
		++self::$_idCount;

		return self::$_idCount;
	}

	/**
	 * 이벤트명 얻기 
	 *
	 * @param int $key 이벤트 상수 
	 * @return string 
	 */
	public static function event($key) { 
		return self::$_eventList[$key];
	}

	/**
	 * instance 얻어오기 
	 *
	 * @param mixed $obj instance를 가지고 있는 객체 
	 * @return mixed getInstance() 메소드를 가지고 있으면 getInstance(), 없으면 $obj 그대로 
	 */
	public static function getInstance($obj) { 
		return (method_exists($obj, 'getInstance')) ? $obj->getInstance(): $obj;
	}

	/**
	 * wbtype 으로 객체 생성하기 
	 *
	 *
	 * @param array|WBComponent $options 
	 * @return WBComponent 
	 */
	public static function createObject($options, $parent = null) { 
		if (is_array($options) || is_string($options)) { 

			if (is_string($options)) { 
				$options = array('layout' => $options);
			}
			
			// wbtype이 지정되지 않았을 때는 Panel로 인식한다. 
			$options['wbtype'] = isset($options['wbtype']) ? $options['wbtype'] : 'Panel';

			if ($options['wbtype']) { 
				$class = strtolower("wb{$options['wbtype']}");

				if (!isset($options['parent'])) { 
					$options['parent'] = WBApplication::getParent($parent);
				} else if (is_string($options['parent'])) {
					$options['parent'] = WBApplication::getObject($optins['parent']);
				}

				$component = new $class($options);

				return $component;
			}
		} else if ($options instanceof WBComponent) {   // WBComponent 일 때 자동으로 parent 추가 

			if (!isset($options->parent)) { 
				$options->setOption('parent', WBApplication::getParent($parent));
				
				return $options;
			}
		}

		return $options;
	}
	
	/**
	 * layout 속성으로 WBXXXLayout 객체 생성 
	 * 
	 * @param array $options
	 * @return WBLayout
	 */
	public static function createLayout($options) {

		// 문자열 일 때는 자동으로 배열로 변환 
		if (is_string($options)) { 
			
			if (trim($options) == '') { 
				return new WBNullLayout();
			}
			
			// 공백이 있으면 속성 설정으로 인식 
			if (strpos($options, " ") !== false) { 
				$arr = explode(" ", $options);
				$arr = array_map('trim', $arr);
				$layout = array_shift($arr);
				
				$options = array('layout' => $layout);
				
				foreach ($arr as $attribute) { 
					$temp = explode("=", $attribute);
					
					$options[$temp[0]] = str_replace(",", " ", $temp[1]);
				}
				
			} else { 
				$options = array('layout' => $options);
			}
		}
		
		// 배열 일 경우 객체 생성해서 리턴 
		if (is_array($options)) { 

			if ($options['layout']) { 
				$class = strtolower("wb{$options['layout']}layout");

				if (in_array(strtolower($options['layout']), self::$_layoutList)) { 
					$component = new $class($options);
					
					return $component;
				}

				return  new WBNullLayout();
			}
		}

		return $options;
	}
	
	/**
	 * create extern module(dll) 
	 * 
	 * @param string $module dll class name 
	 * @return WBLibrary
	 */
	public static function createExternModule($module) { 
		$class = strtolower("wb".$module);
		
		return new $class();
	}
	

	/**
	 * 클래스 상수에 따른 문자열 
	 *
	 * @param string $class 클래스 상수 
	 * @return string 
	 * 
	 */
	public static function getClassName($class) { 
		return self::$_classList[$class];
	}
	
	/**
	 * 넘겨진 인코딩을 시스템 인코딩으로 자동으로 바꾼다. 
	 * 
	 * @param unknown_type $str
	 * @param unknown_type $encode
	 * @return unknown_type
	 */
	public static function getUnicode($str, $encode = 'UTF-8') { 
		// 시스템 인코딩 찾기 
		
		// 변경 
		return $str;
	}
}

?>